package com.apps.java.javanote02;

public class _24多线程_实现多线程 {
    /**
     *实现多线程
     * 	一、进程和线程概述
     * 		1.进程：是正在运行的程序
     * 			 	是系统进行资源分配和调用的独立单位
     * 				每一个进程都有它自己的内存空间和系统资源
     * 		2.线程：是进程中的单个顺序控制流，是一条执行路径
     * 				单线程：一个进程如果只有一条执行路径，则称为单线程程序
     * 				多线程：一个进程如果有多条执行路径，则称为多线程程序
     *
     * 	二、设置和获取线程名称
     * 		1.Thread类中设置和获取线程名称的方法
     * 			（1）void setName(String name)；将此线程的名称更改为等于参数name
     * 			（2）String getName()：返回此线程的名称
     * 			（3）通过构造方法也可以设置线程名称
     *
     * 		2.如何获取main()方法所在的线程名称？
     * 			public static Thread currentThread()：返回对当前正在执行的线程对象的引用
     *
     * 	三、线程调度（java使用的是抢占式调度模型）
     * 		1.线程优两种调度模型（多线程程序的执行有随机性）
     * 			（1）分时调度模型：所有线程轮流使用CPU的使用权，平均分配每个线程占用CPU的时间片
     * 			（2）	抢占时调度模型：优先让优先级高的线程使用CPU，如果线程的优先级相同，那么会随机选择一个，优先级高的线程获取的CPU时间片相对多一些
     * 		2.Thread类中设置和获取线程优先级的方法
     * 			（1）public final int getPriority()：返回此线程的优先级
     * 			（2）public final void setPriority(int newPriority)：更改此线程的优先级
     * 			.线程默认优先级是5；线程优先级的范围是1-10
     * 			.线程优先级高仅仅表示线程获取的CPU时间片的几率高；
     *
     * 	四、线程控制
     * 		方法名
     * 		static void sleep(long millis)	使当前正在执行的线程停留（暂停执行）指定的毫秒数
     * 		void join()						等待这个线程死亡
     * 		void setDaemon(boolean on)		将此线程标记为守护线程，当运行的线程都是守护线程时，java虚拟机将退出
     *
     * 	五、线程的生命周期
     * 		创建线程对象[新建] ---start()---> 执行资格没有执行权[就绪] ---抢到CPU的执行权---> 有执行资格有执行权[运行] ---run()结束/stop()---> 线程死亡变成垃圾[死亡]
     * 									 [就绪]<---其他线程抢走CPU执行权---/				|---sleep()/其他阻塞式方法---> 没有执行资格没有执行权[阻塞] ---sleep()方法时间到/阻塞方式结束 ---> [就绪]
     *
     * 	六、多线程的实现方式
     * 		1.方式一：继承Thread()类
     * 		2.方式二：实现Runnable
     * 			（1）定义一个类MyRunnable实现Runnable接口
     * 			（2）在MyRunnable重写run方法
     * 			（3）创建MyRunnable类的对象
     * 			（4）创建Thread类对象，把MyRunnable对象作为构造方法的参数
     * 			（5）启动线程
     * 		3.相比继承Thread类，实现Runnable接口的好处
     * 			（1）避免了java单继承的局限性
     * 			（2）适合多个相同程序的代码去处理同一个资源的情况，把线程和程序的代码、数据有效分离，较好的体现了面向对象的设计思想。
     *
     *
     *
     *
     *
     *
     *
     */
    public static void main(String[] args) throws InterruptedException {

        //创建线程对象
        MyThread my1 = new MyThread();
        MyThread my2 = new MyThread();

		/*
		//void setName(String name)；将此线程的名称更改为等于参数name
		my1.setName("飞机：");
		my2.setName("高铁：");
		*/

        //Thread(String name)
        MyThread my3 = new MyThread("飞机：");
        MyThread my4 = new MyThread("高铁：");


        //启动线程
//		my1.start();
//		my2.start();
//		my3.start();
//		my4.start();

        //static Thread currentThread()：返回对当前正在执行的线程对象的引用
        System.out.println(Thread.currentThread().getName());

        System.out.println("-------------------");

        System.out.println("默认优先级：");

        //public final int getPriority()：返回此线程的优先级
        System.out.println("my3的优先级：" + my3.getPriority());
        System.out.println("my4的优先级：" + my4.getPriority());

        System.out.println("------------------");

        //public final void setPriority()：更改此线程的优先级
        //my3.setPriority(99);//java.lang.IllegalArgumentException：非法参数异常
        my3.setPriority(1);
        my4.setPriority(10);

        System.out.println("修改后的优先级：");
        System.out.println("my3的优先级：" + my3.getPriority());
        System.out.println("my4的优先级：" + my4.getPriority());

        System.out.println("------------------");

        //启动线程
		/*
//		my3.start();
//		my4.start();

		ThreadSleep ts1 = new ThreadSleep();
		ThreadSleep ts2 = new ThreadSleep();
		ThreadSleep ts3 = new ThreadSleep();

		ts1.setName("赵丽颖");
		ts2.setName("杨幂");
		//设置主线程为刘诗诗
		Thread.currentThread().setName("刘诗诗");

		//void setDaemon(boolean on)将此线程标记为守护线程，当运行的线程都是守护线程时，java虚拟机将退出
		ts2.setDaemon(true);

		//启动线程
		ts1.start();
		//void join()等待这个线程死亡
		ts1.join();
		ts2.start();

		//主线程循环输出
		for(int i=0 ; i<10 ; i++){
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
	*/

        System.out.println("--------------------");

        //多线程实现方式：实现Runnable

        //创建MyRunnable对象
        MyRunnable mrun = new MyRunnable();

        //创建Thread类对象，把MyRunnable对象作为构造方法的参数
        //Thread(Runnable target)
        Thread th = new Thread(mrun);
        Thread th2 = new Thread(mrun,"大黄蜂");

        //启动线程
        th.start();
        th2.start();


    }
}
